//
//  main.cpp
//  exponential
//
//  Created by Wong Hui Hern on 2023/9/27.
//

#include <iostream>

using namespace std;

double mpow(double x, int n);
void deter(double x);
void test1();
void test2();
void test3();
void test4();
void test5();
void test6();
void test7();
void test8();
int flag=1;

int main(int argc, const char * argv[]) {
    test1();
    test2();
    test3();
    test4();
    test5();
    test6();
    test7();
    test8();
    return 0;
}

double mpow(double x,int n){
    if(x==0){
        if(n<=0){
            flag=-1;
            return 0; //40行是没用的代码
        }
        else{
            flag=1;
            return 0;
        }
    }
    else{
        if(n<0){
            n=-n;
            x=1.0/x;
            if(n==1){
                return x;
            }
            else if(n&1){
                return x*mpow(x*x,n/2);
            }
            else{
                return mpow(x*x,n/2);
            }
        }
        else{
            if(n==0){
                return 1;
            }
            else if(n==1){
                return x;
            }
            else if(n&1){
                return x*mpow(x*x,n/2);
            }
            else{
                return mpow(x*x,n/2);
            }
        }
    }
}

void deter(double x){
    if(flag==-1){
        cout<<"Math Error!"<<endl;
    }
    else cout<<"The answer is "<<x<<endl;
}

void test1(){
    double x=mpow(0,0);
    deter(x);
}

void test2(){
    double x=mpow(0,5);
    deter(x);
}

void test3(){
    double x=mpow(4,3);
    deter(x);
}

void test4(){
    double x=mpow(2.1,3);
    deter(x);
}

void test5(){
    double x=mpow(2,-3);
    deter(x);
}

void test6(){
    double x=mpow(-2,-3);
    deter(x);
}

void test7(){
    double x=mpow(-2,3);
    deter(x);
}

void test8(){
    double x=mpow(-2,0);
    deter(x);
}
